home *** CD-ROM | disk | FTP | other *** search
/ Aminet 43 / Aminet 43 (2001)(GTI - Schatztruhe)[!][Jun 2001].iso / Aminet / game / role / World.lha / source / motion.c < prev    next >
C/C++ Source or Header  |  2001-03-06  |  17KB  |  852 lines

  1. #include "parame.inc"
  2. #include "variab.h"
  3. #include "arrays.h"
  4. #include "trvtbl.inc"
  5.  
  6. /* World C Version 1.00 copyright 1987 J.D.McDonald 
  7.    Use as you like for non-commercial purposes, but please
  8.    leave this note, and document any changes you make as yours */
  9.  
  10.     static  int     rax[] = {556, 2445, 7552, 1105, 3111};
  11.     static  int     dx[] = {2331, 4293, 2204, 6339, 3325};
  12.     static  int     locx[] = {176, 177, 178, 179, 180};
  13.  
  14. vship()
  15. {
  16.     int             locy, i;
  17.  
  18.     if (wrdnum[0] == ACTIVA) {
  19.     if ((loc < 175 || loc > 181) && loc != 184 && loc != 187)
  20.         speak(71);
  21.     else if (lpill == 0)
  22.         speak(237);
  23.     else if (obloc[YROD] != 2000 + YCLIP || obloc[BSAPPH] != BCLIP + 2000)
  24.         speak(539);
  25.     else if ((obimpr[BDOOR] & 2) == 0)
  26.         speak(544);
  27.     else if (spcloc != 2)
  28.         speak(542);
  29.     else if (loc == 181 || loc == 184 || loc == 187) {
  30.         speak(536);
  31.         oldloc = 0;
  32.         oldlc2 = 0;
  33.         if (loc == 181)
  34.         loc = 177;
  35.         else if (loc == 184)
  36.         loc = 180;
  37.         else
  38.         loc = 179;
  39.     } else {
  40.         locy = 0;
  41.         for (i = 0; i < 5; i++) {
  42.         if (rax[i] == raset && dx[i] == decset)
  43.             locy = locx[i];
  44.         }
  45.         if (locy == 0)
  46.         speak(537);
  47.         else if (loc == locy)
  48.         speak(500);
  49.         else {
  50.         speak(538);
  51.         if (loc == 175)
  52.             speak(545);
  53.         for (i = 1; i <= MOVMAX; i++)
  54.             if (obloc[i] == loc)
  55.             obloc[i] = locy;
  56.         loc = locy;
  57.         oldloc = 0;
  58.         oldlc2 = 0;
  59.         }
  60.     }
  61.     } else if (loc < 176 || loc > 180)
  62.     speak(71);
  63.     else if (lpill == 0)
  64.     speak(237);
  65.     else if (obloc[YROD] != YCLIP + 2000 || obloc[BSAPPH]
  66.          != BCLIP + 2000)
  67.     speak(539);
  68.     else if ((obimpr[BDOOR] & 2) == 0)
  69.     speak(544);
  70.     else if (spcloc != 2)
  71.     speak(542);
  72.     else if (loc == 176)
  73.     speak(540);
  74.     else if (loc == 178)
  75.     speak(541);
  76.     else if (spcloc != 2)
  77.     speak(543);
  78.     else {
  79.     oldloc = 0;
  80.     oldlc2 = 0;
  81.     speak(543);
  82.     if (loc == 177)
  83.         locy = 181;
  84.     else if (loc == 179)
  85.         locy = 187;
  86.     else
  87.         locy = 184;
  88.     for (i = 1; i <= MOVMAX; i++)
  89.         if (obloc[i] == loc)
  90.         obloc[i] = locy;
  91.     loc = locy;
  92.     }
  93. }
  94.  
  95.  
  96. vcross()
  97. {
  98.     int             result;
  99.  
  100.     result = 0;
  101.     /* the tree over the chasm */
  102.  
  103.     if ((loc == 19 || loc == 21) && (dobjs[0] == TREE ||
  104.                dobjs[0] == LOG || dobjs[0] == CHASM) && (prepdo == 0
  105.                   || prepdo == OVER) && (iobj == TREE || iobj ==
  106.                              LOG || iobj == 0)) {
  107.     result = 1;
  108.     prepdo = 0;
  109.     dobjs[0] = NORTHE;
  110.     if (loc == 21)
  111.         dobjs[0] = SOUTHW;
  112.     }
  113.     /* you can't "cross" the lake  */
  114.  
  115.     else if ((loc == 5 || loc == 6 || loc == 15 || loc == 17) && (
  116.                              dobjs[0] == WATER))
  117.     speak(47);
  118.     else
  119.     speak(94);
  120.     return (result);
  121. }
  122.  
  123.  
  124. vcrawl()
  125. {
  126.     int             result;
  127.     result = 0;
  128.     /* you can crawl over the log   */
  129.  
  130.     if ((loc == 19 || loc == 21) && (dobjs[0] == TREE ||
  131.                      dobjs[0] == LOG || dobjs[0] == CHASM) &&
  132.     prepdo == OVER) {
  133.     adverb = CAREFU;
  134.     prepdo = 0;
  135.     oldlc2 = oldloc;
  136.     oldloc = loc;
  137.     if (loc == 19)
  138.         loc = 21;
  139.     else
  140.         loc = 19;
  141.     }
  142.     /* if "crawl direction" but not u or d, then call go  */
  143.  
  144.     else if (dobjs[0] <= NORTHW && prepdo == 0) {
  145.     if (loc == 19 || loc == 21)
  146.         adverb = CAREFU;
  147.     result = 1;
  148.     speak(109);
  149.     }
  150.     /* otherwise, don't understand  */
  151.  
  152.     else
  153.     speak(94);
  154.     return (result);
  155.  
  156. }
  157.  
  158.  
  159.  
  160.  
  161.  
  162.  
  163.  
  164. vjump()
  165. {
  166.     int             result, ncarrd, nweigh, kcarrd, kweigh;
  167.     result = 0;
  168.     /* can't jump if dead */
  169.  
  170.     if (deadf) {
  171.     speak(46);
  172.     return (result);
  173.     }
  174.     /* jumping off the spire is fatal  */
  175.  
  176.     if ((loc == 13 || loc == 14) && ((dobjs[0] == SPIRE &&
  177.                       prepdo == OFF) || dobjs[0] == 0)) {
  178.     speak(49);
  179.     speak(37);
  180.     oldlc2 = 0;
  181.     oldloc = 0;
  182.     loc = 12;
  183.     vdead();
  184.     return (result);
  185.     }
  186.     /* trying to jump the chasm isn't too smart either  */
  187.  
  188.     if ((loc == 21 || loc == 19) && (dobjs[0] == 0 || ((dobjs[0] ==
  189.          CHASM || dobjs[0] == TREE || dobjs[0] == LOG) && (prepdo ==
  190.                            0 || prepdo == OVER)))) {
  191.     speak(49);
  192.     speak(38);
  193.     oldlc2 = 0;
  194.     oldloc = 0;
  195.     loc = 22;
  196.     locdat[22] |= 16384;
  197.     vdead();
  198.     return (result);
  199.     }
  200.     /* but you can jump onto the tower  */
  201.  
  202.     if (loc == 48 && (dobjs[0] == 0 || dobjs[0] == TOWER) &&
  203.     (prepdo == ON || prepdo == 0)) {
  204.     /* if you're not carrying too much  */
  205.  
  206.     burden(&ncarrd, &nweigh, &kcarrd, &kweigh);
  207.     if (ncarrd == 0 && (obloc[ZKNAPS] != 1000 && obloc[ZKNAPS]
  208.                 != 3000) && wirelc[5] != 1000) {
  209.         speak(136);
  210.         oldlc2 = oldloc;
  211.         oldloc = loc;
  212.         loc = 49;
  213.     } else
  214.         speak(139);
  215.  
  216.     return (result);
  217.     }
  218.     /* but not off the tower  */
  219.  
  220.     if ((loc == 49) && ((dobjs[0] == TOWER &&
  221.              prepdo == OFF) || dobjs[0] == 0)) {
  222.     speak(49);
  223.     speak(137);
  224.     oldlc2 = 0;
  225.     oldloc = 0;
  226.     loc = 48;
  227.     vdead();
  228.     return (result);
  229.     }
  230.     /* jumping at the barrier   */
  231.  
  232.     if ((loc == 26 || loc == 27) && dobjs[0] == BARRIE) {
  233.     if (prepdo == OVER || prepdo == 0) {
  234.         speak(170);
  235.         return (result);
  236.     } else if (prepdo == THROUG) {
  237.         oldloc = 0;
  238.         oldlc2 = 0;
  239.         if (loc == 26)
  240.         loc = 27;
  241.         else
  242.         loc = 26;
  243.     }
  244.     }
  245.     /* bottomless pit   */
  246.  
  247.     if (loc == 96) {
  248.     oldloc = 0;
  249.     oldlc2 = 0;
  250.     if (dobjs[0] == TUNNEL)
  251.         loc = 102;
  252.     else {
  253.         speak(266);
  254.         vdead();
  255.         loc = 97;
  256.     }
  257.     }
  258.     /* wheeeeeee!!!  */
  259.  
  260.     speak(49);
  261.     return (result);
  262. }
  263.  
  264.  
  265. vgo()
  266. {
  267.     int             aloc, xretr, dir, errno, nloc, k, kkk, indx1, ix;
  268.     int             m, n, xgox, kk, indx2, s;
  269.  
  270.  
  271.     /* the entrance to the cave at the waterfall */
  272.  
  273.     rmove = 0;
  274.     if (prepdo == BEHIND && loc == 24 && dobjs[0] == HORSET) {
  275.     horflg = 1;
  276.     oldlc2 = oldloc;
  277.     oldloc = loc;
  278.     loc = 25;
  279.     return;
  280.     }
  281.     aloc = loc;
  282.     if (actor == ROBOT)
  283.     aloc = obloc[ZROBOT];
  284.     /* translate go through barrier to direction  */
  285.  
  286.     if (dobjs[0] == BARRIE && prepdo == THROUG) {
  287.     prepdo = 0;
  288.     if (aloc == 26)
  289.         dobjs[0] = NORTHE;
  290.     else if (aloc == 19)
  291.         dobjs[0] = SOUTHW;
  292.     else if (aloc == 62 || aloc == 50)
  293.         dobjs[0] = NORTH;
  294.     else if (aloc == 86 || aloc == 63)
  295.         dobjs[0] = SOUTH;
  296.     else if (aloc == 68)
  297.         dobjs[0] = WEST;
  298.     else if (aloc == 90)
  299.         dobjs[0] = EAST;
  300.     else
  301.         prepdo = THROUG;
  302.     }
  303.     /*
  304.  
  305.      * all prepositional expressions must be handled by special code above
  306.  
  307.      * this point  
  308.  
  309.      
  310. */
  311.  
  312.     if (prepdo > DOWN) {
  313.     speak(94);
  314.     return;
  315.     }
  316.     xretr = 0;
  317.     dir = 0;
  318.     errno = 0;
  319.     if (prepdo == UP || prepdo == DOWN) {
  320.     if (dobjs[0] == 0)
  321.         dir = prepdo + 9 - PRPMIN;
  322.     else if (dobjs[0] > 0 && dobjs[0] <= NORTHW)
  323.         errno = 57;
  324.     else if (dobjs[0] == SPIRE && (aloc >= 12 && aloc <= 14))
  325.         dobjs[0] = 0;
  326.     else
  327.         errno = 28;
  328.     } else if (dobjs[0] > 0 && dobjs[0] <= NORTHW)
  329.     dir = dobjs[0] + 1 - NUNMIN;
  330.     else
  331.     errno = 28;
  332.     if (errno != 0)
  333.     goto lab9000;
  334.     /****** we have reached the point where we use the travel table  */
  335.     xgox = 0;
  336.     k = dir;
  337.     kkk = k;
  338.     if (adverb == QUICKL)
  339.     k = k + 64;
  340.     if (adverb == SLOWLY)
  341.     k = k + 32;
  342.     if (adverb == CAREFU)
  343.     k = k + 16;
  344.     /*
  345.      * if he says "go quickly" that will match "go quickly" or just "go" but
  346.      * "go" will not match "go quickly" . same for other adverbs 
  347.      */
  348.  
  349.     if (deadf)
  350.     k = kkk;
  351.     indx1 = dispat[aloc];
  352.     indx2 = dispat[aloc + 1];
  353.     for (ix = indx1; ix <= indx2 - 2; ix += 2)
  354.     if (trvtbl[ix] == k || kkk == trvtbl[ix])
  355.         goto lab200;
  356.     errno = 58;
  357.     goto lab9000;
  358. lab200:
  359.     indx1 = ix + 1;
  360.     m = trvtbl[indx1] / 512;
  361.     n = trvtbl[indx1] - m * 512;
  362.     if (actor != 1 && actor != ROBOT)
  363.     return;
  364.     else if (actor == ROBOT) {
  365.     if (m == 1) {
  366.         xgox = 1;
  367.         nloc = n;
  368.     } else if (m == 3 && n == 13 && aloc == 68) {
  369.         xgox = 1;
  370.         nloc = 90;
  371.     } else if (m == 3 && n == 6 && aloc == 74) {
  372.         xgox = 1;
  373.         nloc = 70;
  374.     } else;
  375.     }
  376.     /* unconditional motion */
  377.  
  378.     else if (m == 1) {
  379.     xgox = 1;
  380.     nloc = n;
  381.     xretr = 1;
  382.     /* unconditional stay where is */
  383.  
  384.     } else if (m == 2) {
  385.     errno = n;
  386.     /* forced to get out of chair */
  387.  
  388.     if (aloc == 184 || aloc == 187 || aloc == 166 ||
  389.         (aloc >= 175 && aloc <= 181))
  390.         spcloc = 0;
  391.     else;
  392.     } else if (m == 3) {
  393.     /***    special conditions */
  394.  
  395.     if (n == 1) {
  396.         /*
  397.          * to climb the spire you must wear shoes, but nothing else, and
  398.          * it must be daytime  
  399.              */
  400.  
  401.         if (daytim == 0 || (turns % 100) > 73) {
  402.         speak(123);
  403.         return;
  404.         }
  405.         if (obloc[CSHOES] == 3000) {
  406.         for (kk = 1; kk <= MOVMAX; kk++) {
  407.             if (kk == CSHOES)
  408.             continue;
  409.             if (obloc[kk] == 1000 || (obloc[kk] == 3000 && kk != CKEY))
  410.             errno = 60;
  411.         }
  412.         if (errno != 60) {
  413.             xgox = 1;
  414.             nloc = 13;
  415.         }
  416.         }
  417.     }
  418.     /* to get behind the horsetails */
  419.  
  420.     else if (n == 2) {
  421.         if (horflg || (locdat[25] & 16384) != 0) {
  422.         xgox = 1;
  423.         nloc = 25;
  424.         }
  425.     }
  426.     /* into the bar  */
  427.  
  428.     else if (n == 3) {
  429.         if (daytim == 1 || deadf) {
  430.         xgox = 1;
  431.         xretr = 1;
  432.         nloc = 42;
  433.         } else if (marflg[0]) {
  434.         speak(128);
  435.         return;
  436.         }
  437.     }
  438.     /* underground from mars */
  439.  
  440.     else if (n == 4 || n == 11) {
  441.         if ((obimpr[MDOOR] & 2) == 0) {
  442.         xgox = 1;
  443.         xretr = 1;
  444.         nloc = 135;
  445.         if (n == 11)
  446.             nloc = 41;
  447.         }
  448.     } else if (n == 5) {
  449.         /* warehouse  */
  450.  
  451.         if ((obimpr[RDOOR] & 2) != 2) {
  452.         xgox = 1;
  453.         xretr = 0;
  454.         nloc = 47;
  455.         if (aloc == 47)
  456.             nloc = 51;
  457.         }
  458.     } else if (n == 6) {
  459.         if ((obimpr[ZVINE] & 56) == 16) {
  460.         xgox = 1;
  461.         nloc = 70;
  462.         xretr = 1;
  463.         }
  464.     } else if (n == 7) {
  465.         /* rabbit hole  */
  466.  
  467.         if (obimpr[RHOLE] == 17) {
  468.         xgox = 1;
  469.         nloc = 96;
  470.         }
  471.     } else if (n == 8) {
  472.         /* going down the pole c */
  473.  
  474.         if ((obimpr[ZLATEX] & 56) == 24) {
  475.         xgox = 1;
  476.         nloc = 80;
  477.         }
  478.     } else if (n == 9 || n == 12) {
  479.         /* glass door  */
  480.  
  481.         if ((obimpr[GDOOR] & 2) == 0) {
  482.         xgox = 1;
  483.         xretr = 1;
  484.         nloc = 136;
  485.         if (aloc == 136)
  486.             nloc = 85;
  487.         }
  488.     }
  489.     /* beehive  */
  490.  
  491.     else if (n == 10) {
  492.         if (obimpr[ZDEET] >= 4096) {
  493.         xgox = 1;
  494.         nloc = 88;
  495.         if (aloc == 88)
  496.             nloc = 87;
  497.         }
  498.     } else if (n == 13);
  499.     else if (n == 14) {
  500.         if (obimpr[ZLOUVE] == 9) {
  501.         xgox = 1;
  502.         xretr = 1;
  503.         nloc = 142;
  504.         if (aloc == 142)
  505.             nloc = 98;
  506.         }
  507.     }
  508.     /* the scree slope  */
  509.  
  510.     else if (n == 15) {
  511.         if (screef > 0) {
  512.         xgox = 1;
  513.         xretr = 1;
  514.         nloc = 151;
  515.         }
  516.     } else if (n == 16) {
  517.         if ((obimpr[ODOOR] & 2) == 0) {
  518.         xgox = 1;
  519.         xretr = 1;
  520.         nloc = 166;
  521.         if (aloc == 166)
  522.             nloc = 165;
  523.         }
  524.     } else if (n == 17) {
  525.         if ((obimpr[BDOOR] & 2) == 0) {
  526.         xgox = 1;
  527.         xretr = 1;
  528.         if (aloc == 174)
  529.             nloc = 175;
  530.         else if (aloc == 175)
  531.             nloc = 174;
  532.         else if (aloc == 181)
  533.             nloc = 182;
  534.         else if (aloc == 184)
  535.             nloc = 185;
  536.         else if (aloc == 187)
  537.             nloc = 188;
  538.         else;
  539.         }
  540.     } else if (n == 18) {
  541.         if (obimpr[HMURAL] == 209) {
  542.         xgox = 1;
  543.         xretr = 1;
  544.         nloc = 170;
  545.         }
  546.     } else {
  547.         linout("bug in travel table", 19);
  548.         return;
  549.     }
  550.     }
  551.     /***    end special conditions
  552.  
  553.             he dies. code give his final location */
  554.  
  555.     else if (m == 4) {
  556.     if (deadf)
  557.         errno = 46;
  558.     else {
  559.         oldlc2 = 0;
  560.         oldloc = 0;
  561.         if (loc == 13 || loc == 14)
  562.         loc = 12;
  563.         if (loc == 19 || loc == 21)
  564.         loc = 22;
  565.         if (loc == 76)
  566.         loc = 79;
  567.         /* if he moved when he dies, special code goes here  */
  568.  
  569.         locdat[loc] |= 16384;
  570.         vdead();
  571.         if (loc == 96) {
  572.         loc = 97;
  573.         locdat[97] |= 16384;
  574.         }
  575.         errno = n;
  576.     }
  577.     }
  578.     /* goes to newloc if he is dead and has been there before */
  579.  
  580.     else if (m == 5) {
  581.     if (deadf && (locdat[n] & 16384) != 0) {
  582.         xgox = 1;
  583.         nloc = n;
  584.     }
  585.     }
  586.     /* motion with some probability */
  587.  
  588.     else if (m >= 16 && m <= 31) {
  589.     s = (m - 15) * 6;
  590.     if (pct(s)) {
  591.         xgox = 1;
  592.         nloc = n;
  593.     }
  594.     } else {
  595.     speak(252);
  596.     return;
  597.     }
  598.  
  599.  
  600.     if (errno != 0)
  601.     goto lab9000;
  602.     if (xgox && actor == 1) {
  603.     if ((locdat[nloc] & 25) == 0 && obloc[25] != 1000 && !deadf)
  604.         errno = 258;
  605.     else if ((locdat[nloc] & 32) != 0) {
  606.         oldlc2 = oldloc;
  607.         oldloc = loc;
  608.         loc = nloc;
  609.         if (!xretr || loc == 38 || loc == 97 || loc == 127
  610.         || loc == 88 || loc == 74 || loc == 96) {
  611.         oldloc = 0;
  612.         oldlc2 = 0;
  613.         }
  614.     } else
  615.         errno = 59;
  616.     } else if (xgox && actor == ROBOT) {
  617.     if ((locdat[nloc] & 64) != 0) {
  618.         obloc[ZROBOT] = nloc;
  619.         rmove = 1;
  620.     } else
  621.         errno = 299;
  622.     } else {
  623.     ix = indx1 + 1;
  624.     if (trvtbl[ix] == kkk || trvtbl[ix] == k)
  625.         goto lab200;
  626.     errno = 58;
  627.     if (actor == 1)
  628.         errno = 299;
  629.     }
  630.     /***   all errors and "you are dead" or "impossibility" messages go here */
  631.  
  632. lab9000:
  633.     if (errno != 0)
  634.     speak(errno);
  635. }
  636.  
  637.  
  638.  
  639. vretre()
  640. /* retreat or back */
  641.  
  642. {
  643.     if (oldloc == 0)
  644.     speak(65);
  645.     else {
  646.     loc = oldloc;
  647.     oldloc = oldlc2;
  648.     oldlc2 = 0;
  649.     }
  650. }
  651.  
  652. vclimb()
  653. {
  654.     int             result;
  655.  
  656.     result = 0;
  657.     /*
  658.  
  659.      * if result is 1 call vgo rubber tree jungle trees 
  660.  
  661.      
  662. */
  663.  
  664.     if ((loc == 64 || loc == 67) && (dobjs[0] == TREE || dobjs[0]
  665.                      == 0))
  666.     speak(430);
  667.     else if ((loc == 78 || loc == 79) && (dobjs[0] == TREE || dobjs[0]
  668.                       == 0))
  669.     speak(431);
  670.     else if (loc == 65 && (prepdo == 0 || prepdo == UP) && (dobjs[0]
  671.                         == TREE || dobjs[0] == 0)) {
  672.     oldlc2 = oldloc;
  673.     oldloc = loc;
  674.     loc = 66;
  675.     } else if (loc == 66 && (prepdo == DOWN || prepdo == 0) && (dobjs[0]
  676.                         == 0 || dobjs[0] == TREE)) {
  677.     oldlc2 = oldloc;
  678.     oldloc = loc;
  679.     loc = 65;
  680.     }
  681.     /* pole  */
  682.  
  683.     else if ((loc == 80 || loc == 79 || loc == 76) && (dobjs[0] == POLE
  684.                                || dobjs[0] == 0)) {
  685.     result = 1;
  686.     wrdnum[0] = GO;
  687.     dobjs[0] = 0;
  688.     if (prepdo == 0)
  689.         prepdo = UP;
  690.     }
  691.     /*
  692.  
  693.      * you can climb the spire if you are careful but the actual motion is
  694.  
  695.      * done by "vgo" 
  696.  
  697.      
  698. */
  699.  
  700.     else if ((loc >= 12 && loc <= 14) && (dobjs[0] == 0 || dobjs[0]
  701.                       == SPIRE)) {
  702.     wrdnum[0] = GO;
  703.     dobjs[0] = 0;
  704.     result = 1;
  705.     if ((loc == 12 && (prepdo == 0 || prepdo == UP)) ||
  706.         (loc == 13 && (prepdo == 0 || prepdo == UP)))
  707.         prepdo = UP;
  708.     else if (((loc == 13 || loc == 14) && prepdo == DOWN) ||
  709.          (loc == 14 && prepdo == 0))
  710.         prepdo = DOWN;
  711.     else;
  712.     }
  713.     /* you can climb over the log but not up a tree!  */
  714.  
  715.     else if (loc == 19 || loc == 21) {
  716.     if ((dobjs[0] == TREE || dobjs[0] == LOG) && prepdo == OVER) {
  717.         prepdo = 0;
  718.         result = 1;
  719.         dobjs[0] = NORTHE;
  720.         {
  721.         if (loc == 21)
  722.             dobjs[0] = SOUTHW;
  723.         }
  724.     } else if (dobjs[0] == TREE && (prepdo == UP || prepdo == 0))
  725.         speak(108);
  726.     else
  727.         speak(94);
  728.     }
  729.     /* you can't climb the tower  */
  730.  
  731.     else if (loc == 48 && (prepdo == 0 || prepdo == UP) &&
  732.          (dobjs[0] == 0 || dobjs[0] == TOWER))
  733.     speak(138);
  734.     /* but you can climb down the tower */
  735.  
  736.     else if (loc == 49 && (prepdo == 0 || prepdo == DOWN) &&
  737.          (dobjs[0] == TOWER || dobjs[0] == 0)) {
  738.     oldlc2 = oldloc;
  739.     oldloc = loc;
  740.     loc = 48;
  741.     }
  742.     /* you can't climb the barrier  */
  743.  
  744.     else if ((loc == 26 || loc == 27) && dobjs[0] == BARRIE)
  745.     speak(170);
  746.     else if (dobjs[0] == TREE) {
  747.     if ((locdat[loc] & 2048) == 2048)
  748.         speak(244);
  749.     else
  750.         speak(245);
  751.     } else if (loc == 20 || (loc >= 52 && loc <= 56)) {
  752.     wrdnum[0] = GO;
  753.     {
  754.         if (prepdo == 0)
  755.         prepdo = UP;
  756.     }
  757.     result = 1;
  758.     } else
  759.     speak(50);
  760.     return (result);
  761. }
  762.  
  763.  
  764. vrun()
  765. {
  766.     int             result;
  767.     result = 0;
  768.     /* ru translates to "go quickly"  */
  769.  
  770.     if (adverb == SLOWLY)
  771.     speak(51);
  772.     else {
  773.     result = 1;
  774.     adverb = QUICKL;
  775.     wrdnum[0] = GO;
  776.     }
  777.     return (result);
  778. }
  779.  
  780.  
  781. vswim()
  782. {
  783.     int             spk, m, i, xloc;
  784.     spk = 0;
  785.     /* he can't swim at night (for no real reason)  */
  786.  
  787.     if (daytim == 0 && (loc == 5 || loc == 6 || loc == 15 || loc
  788.             == 17))
  789.     spk = 122;
  790.     /* he can't swim while dead */
  791.  
  792.     else if (deadf)
  793.     spk = 46;
  794.     /* you must swim in the lake or poool  */
  795.  
  796.     else if ((loc < 5 || loc > 17 || (loc > 6 && loc < 15))
  797.          && loc != 122)
  798.     spk = 52;
  799.     else;
  800.     if (spk != 0) {
  801.     speak(spk);
  802.     return (0);
  803.     }
  804.     m = dobjs[0];
  805.     if ((m == WATER && prepdo != IN) || ((m == ISLAND || m == SHORE)
  806.                 && prepdo != TO) || (m == POOL && prepdo != IN))
  807.     spk = 28;
  808.     else if ((loc == 5 && (m == WEST || m == ISLAND)) ||
  809.          (loc == 15 && m == EAST) ||
  810.          (loc == 16 && m == SOUTH))
  811.     xloc = 6;
  812.     else if (loc == 6 && (m == EAST || m == SHORE))
  813.     xloc = 5;
  814.     else if ((loc == 6 && m == NORTH) ||
  815.          (loc == 17 && (m == SOUTH || m == ISLAND)) ||
  816.          (loc == 16 && m == WEST))
  817.     xloc = 15;
  818.     else if ((loc == 6 && m == SOUTH) || (loc == 15 && m == WEST))
  819.     xloc = 16;
  820.     else if (loc == 15 && (m == NORTH || m == SHORE))
  821.     xloc = 17;
  822.     else if ((loc == 5 || loc == 6 || (loc <= 17 && loc >= 15))
  823.          && (m == WATER)) {
  824.     if (dirty < 10)
  825.         spk = 110;
  826.     else
  827.         spk = 111;
  828.     } else if (loc == 122 && m == POOL)
  829.     xloc = 123;
  830.     else
  831.     spk = 54;
  832.     if (spk == 0) {
  833.     /* but not if you are wearing too much  */
  834.  
  835.     for (i = 1; i <= MOVMAX; i++) {
  836.         if (i == CSHOES || i == CKEY || i == CFISH || i == DFISH
  837.         || i == BNET || i == GSPHER)
  838.         continue;
  839.             if(obloc[i] == 1000 || obloc[i] == 3000) {
  840.             speak(53);
  841.             return (0);
  842.             }
  843.     }
  844.     oldlc2 = 0;
  845.     oldloc = 0;
  846.     loc = xloc;
  847.     return (0);
  848.     }
  849.     speak(spk);
  850.     return (0);
  851. }
  852.